/*
    1、
*/
#include <pthread.h>
#include <stdio.h>

#include "DarberIpfs.h"

// 封装第一种线程：执行完毕，自己退出； 主线程需要while 或者 pthread_join
// pthread 是一个无符号64位数字
// **************** 考虑一个darber_thread_raw,不要加入 join
pthread_t darber_thread(darber_thread_body body)
{
    pthread_t th;
    int ret;

    if(NULL == body)
        return -1;

    ret = pthread_create(&th, NULL, body,NULL);  
    if(ret != 0)
        return -1;   

    pthread_join(th,NULL);

    return th;
}

// 封装第二种线程：除非外部主动销毁，否则该线程一直while循环执行
// 考虑加线程锁——先不管
static void *thread_loop_body(void *arg)
{
    darber_thread_body p;

    if(NULL == arg)
        return NULL;

    p = (darber_thread_body)arg;
    while(1)
    {
        (*p)(NULL);
    }
}

pthread_t darber_thread_while(darber_thread_body body)
{
    pthread_t th;
    int ret;

    if(NULL == body)
        return -1;

    ret = pthread_create(&th,NULL,thread_loop_body,body);  
    if(ret != 0)
        return -1;   

    return th;
}

// -----------------------------------
static void *thread_loop_wait(void *arg)
{
    darber_while_wait p;

    if(NULL == arg)
        return NULL;

    p = (darber_while_wait)arg;
    while(0 == (*p)(NULL));
}

pthread_t darber_thread_while_wait(darber_while_wait body)
{
    pthread_t th;
    int ret;

    if(NULL == body)
        return -1;

    ret = pthread_create(&th,NULL,thread_loop_wait,body);  
    if(ret != 0)
        return -1;   

    pthread_join(th,NULL);

    return th;
}

// pth_func_while_till
// static void *thread_loop_till_body(void *arg)
// {
//     pth_func_while_till *p;

//     if(NULL == arg)
//         return NULL;

//     p = (pth_func_while_till *)arg;

//     if( (NULL == p->condition) || (NULL == p->loop) )
//         return NULL;

//     while(0 == (p->condition)())
//     {
//         (p->loop)(NULL);
//     }
    
// }

// pthread_t darber_thread_while_till(pth_func_while_till *loop_till)
// {
//     pthread_t th;
//     int ret;

//     if(NULL == loop_till)
//         return -1;

//     ret = pthread_create(&th,NULL,thread_loop_body,loop_till);  
//     if(ret != 0)
//         return -1;   

//     return th;    
// }


// end of file ----------------------------------------------------------------
